package com.onlyxiahui.common.action.description.box;

import com.onlyxiahui.common.action.description.enums.data.JsonDataType;
import com.onlyxiahui.common.action.description.util.ActionClassUtil;

/**
 * Description <br>
 * Date 2020-01-09 09:10:26<br>
 * 
 * @author XiaHui [onlovexiahui@qq.com]<br>
 * @since 1.0.0
 */

public class JsonDataTypeBox {

	public static String getType(Class<?> classType) {
		if (isInteger(classType)) {
			return JsonDataType.Integer.type();
		}
		if (isLong(classType)) {
			return JsonDataType.Long.type();
		}
		if (isNumber(classType)) {
			return JsonDataType.Number.type();
		}
		if (isBoolean(classType)) {
			return JsonDataType.Boolean.type();
		}
		if (isString(classType)) {
			return JsonDataType.String.type();
		}
		if (isObject(classType)) {
			return JsonDataType.Object.type();
		}
		if (isArray(classType)) {
			return JsonDataType.Array.type();
		}
		return JsonDataType.String.type();
	}

	public static boolean isInteger(Class<?> classType) {
		return ActionClassUtil.isInteger(classType)
				|| ActionClassUtil.isByte(classType)
				|| ActionClassUtil.isShort(classType);
	}

	public static boolean isLong(Class<?> classType) {
		return ActionClassUtil.isLong(classType) || ActionClassUtil.isBigInteger(classType);
	}

	public static boolean isNumber(Class<?> classType) {
		return ActionClassUtil.isNumber(classType)
				&& (!isInteger(classType)
						&& !isLong(classType));
	}

	public static boolean isString(Class<?> classType) {
		return ActionClassUtil.isString(classType)
				|| (ActionClassUtil.isBaseProperty(classType)
						&& !isInteger(classType)
						&& !isLong(classType)
						&& !isNumber(classType)
						&& !isBoolean(classType)
						&& !ActionClassUtil.isPrimitive(classType));
	}

	public static boolean isBoolean(Class<?> classType) {
		return ActionClassUtil.isBoolean(classType);
	}

	public static boolean isArray(Class<?> classType) {
		return ActionClassUtil.isArray(classType) || ActionClassUtil.isCollection(classType);
	}

	public static boolean isObject(Class<?> classType) {
		return !isInteger(classType)
				&& !isLong(classType)
				&& !isBoolean(classType)
				&& !isNumber(classType)
				&& !isString(classType)
				&& !isArray(classType);
	}
}
